<?php

/** 
 * @class XQL_Manager
 * @extends pObject
 *
 */
class XQL_Manager
{
	/**
	 * A kapcsolathoz tartozó tárolt lekérések.
	 * @var Array
	 */
	static protected $registry = array();

	/**
	 * A tárolt lekérések mappájának elérési útja
	 * @var String
	 */
	static protected $storePath = '';

	/**
	 * A lekérések tárolására használt fájl elérési útja és neve
	 * @var String
	 */
	static protected $storeFilePath = '';

	/**
	 * Az osztály által kezelt kapcsolatok
	 * @var Array of XQL_Connection
	 */
	static protected $connections = array();

	/**
	 * Az osztály által kezelt napló bejegyzések
	 * @var Array
	 */
	static protected $debugLog = array();

	/**
	 * A tárolt lekérések munkafolyamat elején űrüljenek (frissítéskor hasznos)
	 * @var Bool
	 */
	static protected $autoDrop = FALSE;

	/**
	 * A munkafolyamat alapértelmezett kapcsolatának álneve.
	 * @var String
	 */
	static protected $marked = 'default';

	/**
	 * Beállítások betöltése és az osztály valamint a kapcsolatok
	 * inicializálása.
	 */
	static public function init()
	{
		$cfg = API_ConfigManager::get('xql');
		self::$autoDrop = !$cfg->queryCache->enable;
		self::$storePath = $cfg->queryCache->path;
		foreach ($cfg->connections as $connData)
		{
			self::$connections[$connData->alias] = new XQL_Connection($connData->alias, $connData);
		} // foreach
		
		if (!file_exists(self::$storePath) or !is_dir(self::$storePath))
		{
			@mkdir(self::$storePath, 0777, TRUE);
			@chmod(self::$storePath, 0777);
		} // if
		
		self::$storeFilePath = self::$storePath.'queries-cache.ini';
		if (!file_exists(self::$storeFilePath) or (file_exists(self::$storeFilePath) and self::$autoDrop))
		{
			@file_put_contents(self::$storeFilePath, '');
			@chmod(self::$storeFilePath, 0666);
		}
		else
		{
			self::$registry = parse_ini_file(self::$storeFilePath, FALSE);
		} // if
	} // static method

	/**
	 * Létezik-e az adott kapcsolat?
	 * @param String $alias
	 * @return Bool
	 */
	static public function isConnectionExists($alias)
	{
		return array_key_exists($alias, self::$connections);
	}

	/**
	 * Kapcsolat lekérése álnév alapján. Nincs létezési ellenőrzés!
	 * @param string $alias
	 * @return XQL_Connection
	 */
	static public function getConnection($alias='default')
	{
		return self::$connections[$alias];
	} // static method

	/**
	 * A megadott álnevű kapcsolat legyen a munkafolyamat kiválasztott
	 * kapcsolata.
	 * @param string $alias
	 */
	static public function markAsUsed($alias='default')
	{
		self::$marked = $alias;
	}

	/**
	 * Az aktuálisan használt kapcsolatot adja vissza.
	 * @return XQL_Connection
	 */
	static public function getUsed()
	{
		return self::$connections[self::$marked];
	}

	/**
	 * Lekérés naplózása a memóriába.
	 * @param String $query
	 */
	static public function logQuery($query)
	{
		$ts = time();
		self::$debugLog[] = date('[Y-m-d H:i:s.', $ts).substr(date('u', $ts), 0, 3).'	] @'.self::$marked.':    '.$query;
	}

	/**
	 * Naplóbejegyzések lekérése.
	 * @return Array
	 */
	static public function getLog()
	{
		return self::$debugLog;
	}

	/**
	 * Tárolandó lekérések tárolása.
	 */
	static public function done()
	{
		$ini = '';
		foreach (self::$registry as $k=>$v)
		{
			$ini .= $k.' = "'.$v.'"'."\n";
		} // foreach
		file_put_contents(self::$storeFilePath, $ini);
	} // static method

	/**
	 * A kapott egyedi névvel és a lekéréssel tárolt lekérést regisztrál.
	 * @param String $name
	 * @param XQL_Object|String $query
	 */
	static public function register($name, $query)
	{
		if (array_key_exists($name, self::$registry))
		{
			throw new XQL_E_Manager_AlreadyExists($name);
		} // if
		
		self::$registry[$name] = (string)$query;
	} // static method

	/**
	 * Az adott nevű tárolt lekérést kiveszi a tárolandók közül.
	 * @param String $name
	 */
	static public function unregister($name)
	{
		if (!array_key_exists($name, self::$registry))
		{
			throw new XQL_E_Manager_NotExists($name);
		} // if
		
		unset(self::$registry[$name]);
	} // static method

	/**
	 * Az adott nevű tárolt lekérést az új lekérésre változtatja (frissíti).
	 * @param String $name
	 * @param XQL_Object|String $query
	 */
	static public function update($name, $query)
	{
		if (!array_key_exists($name, self::$registry))
		{
			throw new XQL_E_Manager_NotExistsUpdate($name);
		} // if
		
		self::$registry[$name] = (string)$query;
	} // static method

	/**
	 * Létezik-e az adott néven tárolt lekérés?
	 * @param String $name
	 * @return Bool
	 */
	static public function exists($name)
	{
		return array_key_exists($name, self::$registry);
	} // static method
	
	/**
	 * Tárolt lekérés visszaadása a neve alapján.
	 * @param String $name
	 * @return String
	 */
	static public function get($name)
	{
		if (!array_key_exists($name, self::$registry))
		{
			throw new XQL_E_Manager_NotExistsGet($name);
		} // if
		return self::$registry[$name];
	} // static method
}

?>